package com.xjh.utils.result;


import com.xjh.utils.enumutils.IBaseEnum;
import com.xjh.utils.enumutils.ResultStatusEnum;
import com.xjh.utils.exception.BaseException;

import java.io.Serializable;

/**
 * 请求返回结果集
 *
 * @author kevin
 * @company 湖南省安第斯信息科技有限公司, 版权所有
 * @date 2021/3/11
 */
public class  Result<T> implements Serializable {

    /** 状态码 */
    private String code;

    /** 提示信息 */
    private String msg;

    /** 返回数据 */
    private T data;

    public Result() {}

    /**
     * 全参构造函数
     *
     * @param code    状态码
     * @param msg 返回内容
     * @param data    返回数据
     */
    private Result(String code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    /**
     * 返回成功
     *
     * @method success
     * @param data
     * @return
     * @author qsheng
     * @date 2021/3/11
     */
    public static <T> Result<T> success(T data) {
        Result<T> result = new Result<T>();
        result.setCode(ResultStatusEnum.SUCCESS.getCode());
        result.setMsg(ResultStatusEnum.SUCCESS.getMsg());
        result.setData(data);
        return result;
    }

    /**
     * 处理中
     *
     * @method pending
     * @param data
     * @return
     * @author peijiang.huang
     * @date 2021/12/14
     */
    public static <T> Result<T> pending(T data) {
        Result<T> result = new Result<T>();
        result.setCode(ResultStatusEnum.PENDDING.getCode());
        result.setMsg(ResultStatusEnum.PENDDING.getMsg());
        result.setData(data);
        return result;
    }

    /**
     * 处理中(无数据返回)
     *
     * @method pending
     * @return
     * @author peijiang.Huang
     * @date 2021/12/14
     */
    public static <T> Result<T> pending() {
        return pending(null);
    }

    /**
     * 返回成功(无数据返回)
     *
     * @method success
     * @return
     * @author qsheng
     * @date 2021/3/11
     */
    public static <T> Result<T> success() {
        return success(null);
    }

    /**
     * 构造一个自定义的API返回
     *
     * @param code    状态码
     * @param msg 返回内容
     * @param data    返回数据
     * @return ApiResponse
     */
    public static <T> Result<T> of(String code, String msg, T data) {
        return new Result<>(code, msg, data);
    }

    /**
     * 构造一个自定义的API返回
     *
     * @param code    状态码
     * @param msg 返回内容
     * @return ApiResponse
     */
    public static <T> Result<T> of(String code, String msg) {
        return new Result<>(code, msg, null);
    }

    /**
     * 构造一个有状态的API返回
     *
     * @param status 状态
     * @return ApiResponse
     */
    public static <T> Result<T> ofStatus(IBaseEnum status) {
        return ofStatus(status, null);
    }

    /**
     * 构造一个有状态且带数据的API返回
     *
     * @param status 状态
     * @param data 返回数据
     * @return ApiResponse
     */
    public static <T> Result<T> ofStatus(IBaseEnum status, T data) {
        return of(status.getCode(), status.getMsg(), data);
    }

    /**
     * 构造一个异常的API返回
     *
     * @param t
     * @return com.andean.frame.core.result.Result
     */
    public static <T extends BaseException> Result ofException(T t) {
        return of(t.getCode(), t.getMessage(), t.getData());
    }

    /**
     * 返回失败(指定状态)
     *
     * @method fail
     * @param status
     * @return
     * @author qsheng
     * @date 2021/3/11
     */
    public static <T> Result<T> fail(IBaseEnum status) {
        Result<T> result = new Result<T>();
        result.setCode(status.getCode());
        result.setMsg(status.getMsg());
        return result;
    }

    /**
     * 返回失败(指定状态码&异常信息)
     *
     * @method fail
     * @param code
     * @param msg
     * @return
     * @author qsheng
     * @date 2021/3/11
     */
    public static <T> Result<T> fail(String code, String msg) {
        Result<T> result = new Result<T>();
        result.setCode(code);
        result.setMsg(msg);
        return result;
    }

    /**
     * 返回失败(指定异常信息)
     *
     * @method fail
     * @param msg
     * @return
     * @author qsheng
     * @date 2021/3/11
     */
    public static <T> Result<T> fail(String msg) {
        return fail(ResultStatusEnum.FAIL.getCode(), msg);
    }

    /**
     * 返回失败(指定异常信息&异常数据)
     *
     * @method fail
     * @param msg
     * @param data
     * @return
     * @author qsheng
     * @date 2021/3/11
     */
    public static <T> Result<T> fail(String msg, T data) {
        Result<T> result = new Result<T>();
        result.setCode(ResultStatusEnum.FAIL.getCode());
        result.setMsg(msg);
        result.setData(data);
        return result;
    }

    /**
     * 返回失败(指定异常数据)
     *
     * @method fail
     * @param data
     * @return
     * @author qsheng
     * @date 2021/3/11
     */
    public static <T> Result<T> fail(T data) {
        Result<T> result = new Result<T>();
        result.setCode(ResultStatusEnum.FAIL.getCode());
        result.setMsg(ResultStatusEnum.FAIL.getMsg());
        result.setData(data);
        return result;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}
